Spring ORM Hibernate এবং JPA-এর মাধ্যমে ডেটাবেস অপারেশন সম্পন্ন করে। Hibernate এবং JPA ডেটাবেস পারফরম্যান্স উন্নত করার জন্য Caching ব্যবহার করে। Caching ডেটা সংরক্ষণ করে, যাতে বারবার ডাটাবেস কল না করে দ্রুত রেসপন্স দেওয়া যায়।
Spring ORM এর সাথে Caching ব্যবহারে ডেটাবেস থেকে ফ্রিকোয়েন্ট ডেটা রিট্রাইভ করার খরচ কমে যায়, যা অ্যাপ্লিকেশনের কার্যকারিতা বাড়ায়।
Caching হল ডেটার একটি অস্থায়ী স্টোরেজ, যা দ্রুত পুনরুদ্ধারযোগ্য। Hibernate বা JPA-এর ক্ষেত্রে দুটি প্রধান ধরণের Cache ব্যবহৃত হয়:
Session session = sessionFactory.openSession();
User user1 = session.get(User.class, 1L); // DB query executed
User user2 = session.get(User.class, 1L); // Cache hit, no DB query
EHCache Hibernate-এর জন্য সবচেয়ে জনপ্রিয় Cache Framework। নিচে Maven ডিপেন্ডেন্সি দেওয়া হলো:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.15.Final</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.10.8</version>
</dependency>
Hibernate Configuration-এ Second-Level Cache সক্রিয় করতে হবে।
import org.hibernate.cache.jcache.ConfigSettings;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HibernateCacheConfig {
@Bean
public Properties hibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.cache.use_second_level_cache", "true");
properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.jcache.JCacheRegionFactory");
properties.setProperty("hibernate.javax.cache.provider", "org.ehcache.jsr107.EhcacheCachingProvider");
return properties;
}
}
Hibernate Cache কাজ করার জন্য Entity-তে @Cache
অ্যানোটেশন ব্যবহার করা হয়। উদাহরণ:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
Hibernate Cache-এ Concurrency Strategy গুরুত্বপূর্ণ ভূমিকা পালন করে। বিভিন্ন স্ট্র্যাটেজি নিচে উল্লেখ করা হলো:
Spring ORM এবং Caching একত্রে ব্যবহারে অ্যাপ্লিকেশন পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়ানো যায়। Cache এর প্রয়োজনীয়তা এবং ডেটার ধরণ অনুযায়ী Lazy Loading এবং Caching স্ট্র্যাটেজি নির্বাচন করা উচিত।
Spring ORM (Object-Relational Mapping) এর মাধ্যমে ডাটাবেস অ্যাক্সেস করার সময় Caching গুরুত্বপূর্ণ ভূমিকা পালন করে। Caching মূলত এমন একটি প্রক্রিয়া যা ডাটাবেস থেকে পুনরাবৃত্ত ডেটা রিট্রিভ করার প্রয়োজনীয়তা কমিয়ে ডাটা অ্যাক্সেসকে দ্রুততর এবং কার্যকর করে তোলে। এটি ORM টুল যেমন Hibernate, JPA-তে ব্যবহৃত হয় এবং Spring ORM এই ফিচারগুলিকে সহজে একীভূত করতে সাহায্য করে।
Caching হল একটি প্রক্রিয়া যেখানে বারবার ব্যবহৃত ডেটা সাময়িকভাবে মেমোরিতে সংরক্ষণ করা হয়, যাতে পুনরায় ডাটাবেসে কল না করেও ডেটা দ্রুত অ্যাক্সেস করা যায়।
ORM এ প্রতিটি ডেটাবেজ কল সময় ও রিসোর্স খরচ করে। Caching ব্যবহার করলে ডেটা একবার রিট্রিভ হওয়ার পর সেটি মেমোরিতে সংরক্ষণ করা হয়, ফলে ডাটাবেসে অতিরিক্ত কলের প্রয়োজন হয় না।
Caching এর মাধ্যমে ডাটাবেস থেকে ডেটা রিট্রিভ করার পরিবর্তে মেমোরি থেকে ডেটা দ্রুত অ্যাক্সেস করা যায়, যা অ্যাপ্লিকেশনের কার্যকারিতা বৃদ্ধি করে।
ডাটাবেসে প্রতি কল নেটওয়ার্ক ট্রাফিক বৃদ্ধি করে। Caching ব্যবহার করলে ডাটাবেস কলের সংখ্যা কমে যায়, ফলে নেটওয়ার্ক ট্রাফিকও হ্রাস পায়।
Caching ব্যবহার করলে অ্যাপ্লিকেশন বড় ডেটাসেট এবং একাধিক ব্যবহারকারীর জন্য কার্যকরভাবে কাজ করতে পারে।
Hibernate Session এর First-Level Cache ডিফল্টভাবেই সক্রিয় থাকে।
Session session = sessionFactory.openSession();
Product product1 = session.get(Product.class, 1); // ডাটাবেস কল হবে
Product product2 = session.get(Product.class, 1); // ক্যাশ থেকে ডেটা আসবে
Hibernate Second-Level Cache সক্রিয় করার জন্য, নিচের ধাপগুলি অনুসরণ করুন:
hibernate.cfg.xml
ফাইল কনফিগার করুন:<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
import jakarta.persistence.Entity;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
// ফিল্ড এবং Getter/Setter
}
ORM-এ Caching এর প্রয়োগ অ্যাপ্লিকেশনকে দ্রুত, কার্যকর, এবং স্কেলেবল করে তোলে। Spring ORM Hibernate এর মতো শক্তিশালী ORM টুলের সঙ্গে কাজ করায় Caching আরও সহজে বাস্তবায়নযোগ্য।
Hibernate একটি শক্তিশালী ORM টুল যা ডেটাবেস অপারেশনে পারফরম্যান্স উন্নত করার জন্য ক্যাশিং মেকানিজম সরবরাহ করে। Hibernate এ ক্যাশিং দুটি স্তরে কাজ করে:
Second Level Cache ডেটা সঞ্চালনে একটি শেয়ারযোগ্য ক্যাশ ব্যবস্থাপনা করে যা একাধিক সেশনের জন্য ব্যবহার করা যায়। এটি ডেটাবেসে পুনরাবৃত্তি অপারেশন কমিয়ে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করে।
প্রতিস্থাপনযোগ্য ক্যাশ প্রোভাইডার:
Ehcache প্রোভাইডার ব্যবহার করে Second Level Cache কনফিগার করার জন্য Maven ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.15.Final</version>
</dependency>
application.properties
ফাইলে Second Level Cache সক্রিয় করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
@Cache
অ্যানোটেশন ব্যবহার করে Second Level Cache কনফিগার করা হয়:
import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "price")
private Double price;
// Getters and Setters
}
CacheConcurrencyStrategy Options:
READ_ONLY
: ডেটা শুধুমাত্র পড়ার জন্য।NONSTRICT_READ_WRITE
: অপ্রচলিত ডেটা আপডেট করার অনুমতি।READ_WRITE
: পড়া এবং লেখা উভয়ের জন্য সঠিক সমন্বয়।TRANSACTIONAL
: সম্পূর্ণ ট্রানজ্যাকশনাল কনসিস্টেন্সি।Query Cache একটি অতিরিক্ত ক্যাশিং মেকানিজম যা Hibernate এর HQL বা Criteria API এর জন্য ব্যবহৃত হয়। এটি সেকেন্ড লেভেল ক্যাশের ওপর নির্ভরশীল।
application.properties
ফাইলে Query Cache সক্রিয় করুন:
spring.jpa.properties.hibernate.cache.use_query_cache=true
Query Cache ব্যবহার করতে হলে HQL বা Criteria Query তৈরি করতে হবে এবং সেটি ক্যাশ সক্ষম করতে হবে।
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;
@Repository
public class ProductRepository {
@Autowired
private Session session;
public List<Product> getCachedProducts() {
Query<Product> query = session.createQuery("from Product", Product.class);
query.setCacheable(true); // Enable query caching
return query.list();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public List<Product> getProducts() {
return productRepository.getCachedProducts();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping
public List<Product> getAllProducts() {
return productService.getProducts();
}
}
ক্যাশিং প্রকার | সুবিধা |
---|---|
Second Level Cache | ডেটাবেস হিট কমিয়ে দ্রুত ডেটা রিট্রাইভ করে। |
Query Cache | বারবার এক্সিকিউট করা কুয়েরির ফলাফল ক্যাশ করে। |
Hibernate Second Level এবং Query Cache ব্যবহার করে অ্যাপ্লিকেশনের কার্যক্ষমতা এবং পারফরম্যান্স অনেকাংশে বৃদ্ধি করা সম্ভব।
Spring Cache Integration স্প্রিং ওআরএম (Spring ORM) এর কার্যক্ষমতা বাড়ানোর জন্য একটি গুরুত্বপূর্ণ উপায়। এটি ডাটাবেস কোয়েরির ফলাফলকে ক্যাশে সংরক্ষণ করে পুনরায় কোয়েরি করার প্রয়োজনীয়তা কমায়, যা অ্যাপ্লিকেশনের গতিশীলতা উন্নত করে।
Spring Cache হলো একটি অ্যাবস্ট্রাকশন লেয়ার যা ডেটা বা কোয়েরির ফলাফলকে ইন-মেমরি ক্যাশে সংরক্ষণ করে। এটি অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ায় এবং পুনরাবৃত্ত ডেটাবেস অ্যাক্সেস কমায়।
Spring Boot ব্যবহার করলে Maven pom.xml
এ নিম্নলিখিত ডিপেনডেন্সি যোগ করতে হবে:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
প্রয়োজন অনুযায়ী, নির্দিষ্ট ক্যাশ টেকনোলজির জন্য ডিপেনডেন্সি যোগ করুন (যেমন EhCache বা Redis)।
@EnableCaching
ব্যবহার করে ক্যাশিং সক্রিয় করাSpring Cache সক্রিয় করতে প্রধান ক্লাসে @EnableCaching
অ্যানোটেশন ব্যবহার করতে হবে:
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableCaching
public class SpringOrmCacheApplication {
public static void main(String[] args) {
SpringApplication.run(SpringOrmCacheApplication.class, args);
}
}
@Cacheable
অ্যানোটেশন ব্যবহার করেকোনো মেথডে ক্যাশিং প্রয়োগ করতে @Cacheable
অ্যানোটেশন ব্যবহার করা হয়। উদাহরণস্বরূপ:
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable("users")
public User findUserById(Long id) {
// Mock database call
System.out.println("Fetching user from database...");
return new User(id, "John Doe");
}
}
@Cacheable("users")
: মেথডের রিটার্ন ভ্যালুকে users
নামক ক্যাশে সংরক্ষণ করে।Spring Boot এর ডিফল্ট SimpleCacheManager ব্যবহার করে। তবে, উন্নত পারফরম্যান্সের জন্য EhCache বা Redis ইন্টিগ্রেট করা যেতে পারে।
EhCache কনফিগারেশন উদাহরণ: ehcache.xml
ফাইল তৈরি করুন:
<ehcache>
<cache name="users"
maxEntriesLocalHeap="1000"
timeToLiveSeconds="3600">
</cache>
</ehcache>
Spring Configuration ক্লাসে EhCache যোগ করুন:
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
factory.setShared(true);
return factory;
}
}
Spring Cache Integration এর পাশাপাশি Hibernate এর Second-Level Cache ব্যবহার করা ORM পারফরম্যান্স বাড়াতে পারে।
application.properties
এ কনফিগারেশন যোগ করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
Hibernate এ Second-Level Cache ক্যাশ প্যারামিটার সংরক্ষণ করে, যা স্প্রিং ক্যাশের সাথে সম্পূর্ণরূপে একীভূত হয়।
Spring Cache Integration এবং Hibernate Second-Level Cache একত্রে ব্যবহার করলে স্প্রিং ওআরএম এর কার্যক্ষমতা উল্লেখযোগ্যভাবে বৃদ্ধি পায়। ক্যাশিং পদ্ধতিতে ইন-মেমরি ডেটা স্টোরেজ ব্যবহার করে ডেটাবেস অ্যাক্সেসের সময় এবং খরচ কমানো হয়। Redis বা EhCache এর মতো উন্নত ক্যাশ সিস্টেম ব্যবহার করলে আরও উন্নত পারফরম্যান্স নিশ্চিত করা যায়।
Caching হলো ডেটা স্টোর করার একটি মেকানিজম, যা বারবার ডাটাবেজে অ্যাকসেস না করে প্রয়োজনীয় ডেটা দ্রুত সরবরাহ করতে সহায়তা করে। Spring ORM এ Hibernate এর ক্যাশিং মেকানিজম ব্যবহার করে ডাটাবেজ অপারেশনের পারফরম্যান্স বৃদ্ধি করা যায়। Hibernate দুই ধরনের ক্যাশিং সরবরাহ করে:
Hibernate সেশনের লেভেলে স্বয়ংক্রিয়ভাবে কাজ করে। এই ক্যাশিং এর জন্য আলাদা কোনো কনফিগারেশন প্রয়োজন নেই।
Spring ORM এ Hibernate Second Level Cache ব্যবহার করতে হলে এটি স্পষ্টভাবে কনফিগার করতে হয়। Hibernate বিভিন্ন ক্যাশিং প্রোভাইডার সাপোর্ট করে, যেমন:
Maven এর pom.xml ফাইলে Hibernate এবং Ehcache এর ডিপেনডেন্সি যোগ করুন:
<dependencies>
<!-- Hibernate Core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- Hibernate Ehcache -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.29</version>
</dependency>
</dependencies>
Hibernate এর hibernate.cfg.xml ফাইলে Second Level Cache এর জন্য কনফিগারেশন যোগ করুন:
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!-- Hibernate properties -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<!-- Enable Second Level Cache -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="hibernate.cache.use_query_cache">true</property>
</session-factory>
</hibernate-configuration>
Ehcache এর জন্য ehcache.xml ফাইল তৈরি করুন:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd">
<cache name="com.example.Employee"
maxEntriesLocalHeap="1000"
timeToLiveSeconds="300">
</cache>
</ehcache>
ক্যাশিং যোগ করার জন্য Entity ক্লাসে @Cache
অ্যানোটেশন যোগ করুন:
Employee.java
import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private int id;
private String name;
private String department;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
EmployeeDAO.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import javax.transaction.Transactional;
@Repository
public class EmployeeDAO {
@Autowired
private SessionFactory sessionFactory;
@Transactional
public Employee getEmployeeById(int id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Employee.class, id); // First Level Cache
}
@Transactional
public Employee getEmployeeWithSecondLevelCache(int id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Employee.class, id); // Second Level Cache
}
}
App.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
EmployeeDAO employeeDAO = context.getBean(EmployeeDAO.class);
// First Query (Hits Database)
Employee emp1 = employeeDAO.getEmployeeById(1);
System.out.println("Employee 1: " + emp1.getName());
// Second Query (Uses Cache)
Employee emp2 = employeeDAO.getEmployeeWithSecondLevelCache(1);
System.out.println("Employee 2: " + emp2.getName());
}
}
Hibernate Second Level Cache এর মাধ্যমে Spring ORM এ কার্যকর ক্যাশিং বাস্তবায়ন করা যায়। Ehcache এর মত ক্যাশিং প্রোভাইডার ব্যবহার করে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করা সহজ হয়।
Read more